package com.zan.zanchat.common.common.utils;

import com.zan.zanchat.common.user.service.impl.UserServiceImpl;
import org.springframework.core.DefaultParameterNameDiscoverer;
import org.springframework.expression.EvaluationContext;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;

import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.util.Optional;

/**
 * @Author Zan
 * @Create 2024/3/17 15:19
 * @Description :
 */
public class SpElUtils {

    /**
     * 解析器
     */
    private static final ExpressionParser PARSER = new SpelExpressionParser();

    /**
     * 参数名获取器
     */
    private static final DefaultParameterNameDiscoverer PARAMETER_NAME_DISCOVERER = new DefaultParameterNameDiscoverer();

    public static String getMethodKey(Method method) {
        return method.getDeclaringClass() + "#" + method.getName(); // 前缀名
    }

    /**
     * 扔到上下文EvaluationContext里面的东西，都可以通过el表达式取出来
     */
    public static String parseSpEl(Method method, Object[] args, String spEl) {
        // 获取所有入参的参数名
//        Parameter[] parameters = method.getParameters(); // 这里必须得自定义拼接方法了
        String[] params = Optional.ofNullable(PARAMETER_NAME_DISCOVERER.getParameterNames(method))
                .orElse(new String[]{});
        EvaluationContext context = new StandardEvaluationContext();//el解析需要的上下文对象
        for (int i = 0; i < params.length; i++) {
            context.setVariable(params[i], args[i]);// 所有参数都作为原材料扔进去
        }
        // PARSER.parseExpression 给解析器设置解析规则
        Expression expression = PARSER.parseExpression(spEl);
        return expression.getValue(context, String.class);
    }
}
